export function throttle(
  func: (...args: any[]) => void,
  wait: number,
  options: { leading?: boolean; trailing?: boolean } = {}
): (...args: any[]) => void {
  let timer: NodeJS.Timeout | null = null;
  let lastArgs: any[] | null = null;
  let lastThis: any;
  let lastCallTime = 0;

  // 解构选项，提供默认值
  const { leading = true, trailing = true } = options;

  // 调用函数的辅助方法
  const invokeFunc = () => {
    if (lastArgs) {
      func.apply(lastThis, lastArgs);
      lastArgs = null;
      lastThis = null;
      lastCallTime = Date.now();
    }
  };

  // 尾部调用函数
  const trailingInvoke = () => {
    timer = setTimeout(() => {
      if (trailing && lastArgs) {
        invokeFunc();
      }
      timer = null;
    }, wait);
  };

  return function (this: any, ...args: any[]) {
    const now = Date.now();

    // 更新调用上下文和参数
    lastArgs = args;
    lastThis = this;

    // 计算距离上次调用过去的时间
    const timeSinceLastCall = now - lastCallTime;

    // 如果是第一次调用
    if (lastCallTime === 0) {
      if (leading) {
        // 立即执行
        invokeFunc();
      }
      // 开始尾部计时器
      trailing && trailingInvoke();
      return;
    }

    // 如果未到冷却时间
    if (timeSinceLastCall < wait) {
      // 如果已有计时器，不需要重复设置
      if (!timer && trailing) {
        trailingInvoke();
      }
      return;
    }

    // 如果到达冷却时间
    if (leading) {
      invokeFunc();
    }

    // 重置尾部计时器
    if (trailing) {
      if (timer) {
        clearTimeout(timer);
        timer = null;
      }
      trailingInvoke();
    }
  };
}